package tur.br.moradadosol.util;

import java.math.BigDecimal;
import java.sql.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Util {
	
	public static Calendar getDate(String data) {
		
		try {
			if(data != null && !data.equals("")) {
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				java.util.Date date = sdf.parse(data);
				
				Calendar newDate = Calendar.getInstance();
				newDate.setTime(date);
				
				return newDate;
			}
			else
				return null;
		}
		catch (ParseException e) {
			return null;
		}
	}
	
	public static String getDate(Calendar data) {
		
		if(data != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			
			return sdf.format(data.getTime());
		}
		else
			return "";
	}
	
	public static java.sql.Date getDataDate(Calendar data) {
		if(data != null)
			return new Date(data.getTime().getTime());
		else
			return null;
	}
	
	public static Calendar getDataCalendar(Date data) {
		
		if(data != null) {
			Calendar date = Calendar.getInstance();
			date.setTime(data);
			
			return date;
		} else {
			return null;
		}
	}
	
	public static Calendar getDataCalendar(java.util.Date data) {
		
		if(data != null) {
			Calendar date = Calendar.getInstance();
			date.setTime(data);
			
			return date;
		} else {
			return null;
		}
	}
	
	public static String getValorFormatado(float valor) {
		DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
		
		return decimalFormat.format(valor);
	}
	
	public static String getValorFormatado(BigDecimal valor) {
		return getValorFormatado(valor.floatValue());
	}
	
	public static float getValorFloat(String valor) {
		DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
		
		try {
			return decimalFormat.parse(valor).floatValue();
		} catch (ParseException e) {
			return 0;
		}
	}
	
	public static boolean isTelefoneValido(String fone) {
		
		Pattern pattern = Pattern.compile("[[0-9]+[\\s]?[-]?[\\s]?[0-9]+]+"); //XXX e o DDD? é em campo separado?
		Matcher validador = pattern.matcher(fone);
		
		return validador.matches();
	}
	
	/**
	 * Verifica se texto é numérico.
	 * @param n texto a ser verificado.
	 * @return true / false
	 */
	public static boolean isNumeric(String n){
		boolean intB = true;
		boolean dblB = true;
		try {Long.parseLong(n);}
		catch (Exception e) { intB = false;}
		try {Double.parseDouble(n);}
		catch (Exception e) { dblB = false;}
		return intB || dblB;
    }
	
	/**
	 * Obtem a diferenca, em dias, entre as datas passadas como parametro.
	 * 
	 * @param inicio - data de inicio do periodo a ser feito o calculo.
	 * @param fim - data de fim do periodo a ser feito o calculo.
	 * @return A quantidade de dias que compreende o periodo, ou seja, os dias
	 * 			entre a data de inicio e a data de fim.
	 */
	public static int getDiffDatas(Calendar inicio, Calendar fim) {
		
		long inicioInMillis = inicio.getTimeInMillis();
		long fimInMillis = fim.getTimeInMillis();
		
		BigDecimal diferenca = new BigDecimal(fimInMillis - inicioInMillis);
		BigDecimal divisor = new BigDecimal(24*60*60*1000);
		
		return diferenca.divide(divisor, BigDecimal.ROUND_HALF_UP).intValue();
	}
	
	public static boolean validaEmail(String email) {
		Pattern pattern = Pattern.compile("[a-z_][a-z0-9._]+@.+\\.[a-z0-9]+");  
		Matcher matcher = pattern.matcher(email);  
		return matcher.matches();
	}
	
	public static int compareDates(Calendar dateToCompare, Calendar when) {
		
		Calendar date1 = Calendar.getInstance();
		Calendar date2 = (Calendar)date1.clone();
		
		date1.set(Calendar.DAY_OF_MONTH, dateToCompare.get(
				Calendar.DAY_OF_MONTH));
		date1.set(Calendar.MONTH, dateToCompare.get(Calendar.MONTH));
		date1.set(Calendar.YEAR, dateToCompare.get(Calendar.YEAR));
		
		date2.set(Calendar.DAY_OF_MONTH, when.get(Calendar.DAY_OF_MONTH));
		date2.set(Calendar.MONTH, when.get(Calendar.MONTH));
		date2.set(Calendar.YEAR, when.get(Calendar.YEAR));
		
		return date1.compareTo(date2);
	}
}
